# D:\Py\python\Script\voice_input_recorder.py
import sounddevice as sd
import wavio
import numpy as np
import time
import os
import sys

# 配置参数
SAMPLE_RATE = 16000  # 语音识别推荐的采样率
CHANNELS = 1        # 单声道
TEMP_AUDIO_FILE = "D:\\Py\\python\\Script\\temp_recording.wav" # 临时音频文件路径
STOP_SIGNAL_FILE = "D:\\Py\\python\\Script\\stop_recording.flag" # 停止信号文件路径

def record_dynamic_audio():
    """动态录制音频，直到检测到停止信号文件"""
    print("录音脚本已启动，等待停止信号...")

    # 确保录音设备可用
    try:
        sd.query_devices(kind='input')
    except Exception as e:
        print(f"错误: 无法找到音频输入设备或设备不可用。请检查麦克风设置。{e}", file=sys.stderr)
        return

    # 删除旧的停止信号文件，确保每次录音都是新的开始
    if os.path.exists(STOP_SIGNAL_FILE):
        os.remove(STOP_SIGNAL_FILE)

    audio_buffer = []
    print("开始实时录音...")

    try:
        # 使用 InputStream 持续捕获音频
        with sd.InputStream(samplerate=SAMPLE_RATE, channels=CHANNELS, dtype='int16') as stream:
            while not os.path.exists(STOP_SIGNAL_FILE):
                # 读取一小段音频数据
                data, overflowed = stream.read(1024) # 读取1024帧
                audio_buffer.append(data)
                # print(f"录音中... 缓冲区大小: {len(audio_buffer)}") # 用于调试，可注释掉
                time.sleep(0.01) # 短暂暂停，避免CPU占用过高

        print("检测到停止信号，录音停止。")

        # 将所有捕获到的音频数据合并
        if audio_buffer:
            full_audio_data = np.concatenate(audio_buffer, axis=0)
            # 保存为 WAV 文件
            wavio.write(TEMP_AUDIO_FILE, full_audio_data, SAMPLE_RATE, sampwidth=2)
            print(f"录音完成，保存到 {TEMP_AUDIO_FILE}")
        else:
            print("未录制到任何音频。")

    except Exception as e:
        print(f"录音过程中发生错误: {e}", file=sys.stderr)
    finally:
        # 清理停止信号文件（如果存在）
        if os.path.exists(STOP_SIGNAL_FILE):
            os.remove(STOP_SIGNAL_FILE)
        print("录音脚本退出。")

if __name__ == "__main__":
    record_dynamic_audio()